import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score

"""
案例：集成学习值bagging思想 随机森林算法 代码
    集成学习：
        概述：把多个弱学习器，组成成一个强的学习器的过程-》集成学习。‘=
        思想：
            bagging思想：
                1：有放回的随机抽取
                2：平权投票
                3：可以并行执行
            boosting思想：
                1：每次训练都使用全部的训练集（样本）
                2：加权投票 ：-》 预测正确 ：权重降低 ，预测错误：权重升高
                3：只能串行执行
            bagging思想代表：
                随机森林算法
            
            随机森林：
                1：每个弱学习器都是CART树（必须二叉树） 
                2：有放回的随机抽样，平权投票，并行执行
"""

# 1、读取数据: train.csv
df = pd.read_csv('train.csv')
# 2、数据预处理
# 特征列:  船舱等级: Pclass 、 性别:Sex 、年龄:Age
# 标签列: Survived
x = df[['Pclass', 'Sex', 'Age']]
y = df['Survived']
# Age列空值填充： Age列平均值
x['Age'].fillna(x['Age'].mean(), inplace=True)

# 热编码
x = pd.get_dummies(x)

# 拆分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=22)

# 场景1：决策树:DecisionTreeClassifier
model1 = DecisionTreeClassifier()
model1.fit(x_train, y_train)
y_pre_1 = model1.predict(x_test)
print('准确率：', accuracy_score(y_test, y_pre_1))

# 场景2：随机森林算法: RandomForestClassifier
model2 = RandomForestClassifier(n_estimators=50, max_depth=5)
model2.fit(x_train, y_train)
y_pre_2 = model2.predict(x_test)
print('准确率：', accuracy_score(y_test, y_pre_2))

# 场景3 网格搜索:n_estimators,max_depth
# RandomForestClassifier，GridSearchCV
random_model = RandomForestClassifier()
param = {'n_estimators': [10, 50, 100, 200], 'max_depth': [3, 5, 7, 9]}
cv_model = GridSearchCV(estimator=random_model, param_grid=param, cv=5)

# 最佳参数
print('**' * 20)
cv_model.fit(x_train, y_train)
print(cv_model.best_estimator_)
y_pre_3 = cv_model.best_estimator_.predict(x_test)
# 准确率
print('准确率：', accuracy_score(y_test, y_pre_3))


